// Copyright (c) 2009, Michael Patraw
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright
//       notice, this list of conditions and the following disclaimer in the
//       documentation and/or other materials provided with the distribution.
//     * The name of Michael Patraw may not be used to endorse or promote 
//       products derived from this software without specific prior written
//       permission.
//
// THIS SOFTWARE IS PROVIDED BY Michael Patraw ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL Michael Patraw BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <cassert>

#include "animals.h"
#include "items.h"

//==============================================================================
//==============================================================================
    
Item::Item(const char * name, int id, type_t type, int warmth, int health, int attack, int defense) :
name_(name),
id_(id), type_(type), warmth_(warmth),
health_(health), attack_(attack), defense_(defense)
{
}

Item::~Item()
{
}

int Item::getId() const
{
    return id_;
}

type_t Item::getType() const
{
    return type_;
}

bool Item::isType(type_t type) const
{
    return type_ & type;
}

int Item::getWarmth() const
{
    return warmth_;
}

int Item::getHealth() const
{
    return health_;
}

int Item::getAttack() const
{
    return attack_;
}

int Item::getDefense() const
{
    return defense_;
}

const char * Item::getName() const
{
    return name_;
}

bool Item::operator ==(const Item & it)
{
    return id_ == it.id_;
}

//==============================================================================
//==============================================================================

ItemList::ItemList(int maxsize) :
maxsize_(maxsize)
{
}

ItemList::~ItemList()
{
    for (int i = 0; i < numItems(); ++i) {
        if (items_[i])
            delete items_[i];
    }
}

int ItemList::numItems() const
{
    return (int)items_.size();
}

Item * ItemList::getItem(int n)
{
    assert(n >= 0 && n < numItems());
    return items_[n];
}

Item * ItemList::remItem(int n)
{
    Item * temp = getItem(n);
    items_.erase(items_.begin() + n);
    
    return temp;
}

void ItemList::delItem(int n)
{
    delete remItem(n);
}

bool ItemList::addItem(Item * item)
{
    if (numItems() > maxsize_ && maxsize_ != -1)
        return false;
    if (item == NULL)
        return false;
    
    items_.push_back(item);
    return true;
}

bool ItemList::isEmpty() const
{
    return items_.size() == 0;
}

bool ItemList::isFull() const
{
    return numItems() == maxsize_;
}
